#include "gtkimage.h"
#include "gtkintl.h"
#include "gtklabel.h"
+#include "gtkorientable.h"
#include "gtkprivate.h"
#include "gtkselectionmodel.h"
#include "gtktogglebutton.h"
*
* `GtkStackSwitcher` uses the %GTK_ACCESSIBLE_ROLE_TAB_LIST role
* and uses the %GTK_ACCESSIBLE_ROLE_TAB for its buttons.
+ *
+ * # Orientable
+ *
+ * Since GTK 4.4, `GtkStackSwitcher` implements `GtkOrientable` allowing
+ * the stack switcher to be made vertical with
+ * `gtk_orientable_set_orientation()`.
*/
#define TIMEOUT_EXPAND 500
enum {
PROP_0,
- PROP_STACK
+ PROP_STACK,
+ PROP_ORIENTATION
};
-G_DEFINE_TYPE (GtkStackSwitcher, gtk_stack_switcher, GTK_TYPE_WIDGET)
+G_DEFINE_TYPE_WITH_CODE (GtkStackSwitcher, gtk_stack_switcher, GTK_TYPE_WIDGET,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE, NULL))
static void
gtk_stack_switcher_init (GtkStackSwitcher *switcher)
return G_SOURCE_REMOVE;
}
-static void
+static void
gtk_stack_switcher_drag_enter (GtkDropControllerMotion *motion,
double x,
double y,
GParamSpec *pspec)
{
GtkStackSwitcher *switcher = GTK_STACK_SWITCHER (object);
+ GtkLayoutManager *box_layout = gtk_widget_get_layout_manager (GTK_WIDGET (switcher));
switch (prop_id)
{
+ case PROP_ORIENTATION:
+ g_value_set_enum (value, gtk_orientable_get_orientation (GTK_ORIENTABLE (box_layout)));
+ break;
+
case PROP_STACK:
g_value_set_object (value, switcher->stack);
break;
GParamSpec *pspec)
{
GtkStackSwitcher *switcher = GTK_STACK_SWITCHER (object);
+ GtkLayoutManager *box_layout = gtk_widget_get_layout_manager (GTK_WIDGET (switcher));
switch (prop_id)
{
+ case PROP_ORIENTATION:
+ {
+ GtkOrientation orientation = g_value_get_enum (value);
+ if (gtk_orientable_get_orientation (GTK_ORIENTABLE (box_layout)) != orientation)
+ {
+ gtk_orientable_set_orientation (GTK_ORIENTABLE (box_layout), orientation);
+ gtk_widget_update_orientation (GTK_WIDGET (switcher), orientation);
+ g_object_notify_by_pspec (object, pspec);
+ }
+ }
+ break;
+
case PROP_STACK:
gtk_stack_switcher_set_stack (switcher, g_value_get_object (value));
break;
GTK_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
+ g_object_class_override_property (object_class, PROP_ORIENTATION, "orientation");
+
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT);
gtk_widget_class_set_css_name (widget_class, I_("stackswitcher"));
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_TAB_LIST);